home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2gem106.lzh / CRYSTAL1.06 / SRC / TOOLBOX / RSRCTOOL.MOD < prev    next >
Encoding:
Modula Implementation  |  1993-10-24  |  6.9 KB  |  326 lines

  1. IMPLEMENTATION MODULE RsrcTool;
  2.  
  3. (*
  4. Resource Tools.
  5.  
  6. UK __DATE__ __TIME__
  7. *)
  8.  
  9. (*IMP_SWITCHES*)
  10. (*DRIVER*)
  11.  
  12. FROM AES      IMPORT Key,ScanWord,ObjectSpec,ObjectTypes,TreePtr,Root,Nil,
  13.                      MaxObject,ObjectIndex,StringPtr,BitBlkPtr,Flag15,LastOb,
  14.                      Global;
  15. FROM FormMgr  IMPORT FormError,NoFile,NoMemory;
  16. FROM GrafMgr  IMPORT GrafHandle;
  17. FROM RsrcMgr  IMPORT RTree,RString,RFrStr,RFrImg,
  18.                      TreeIndex,StringIndex,FreeStringIndex,FreeImageIndex,
  19.                      FreeStringPtr,FreeImagePtr,
  20.                      rsrcload,RsrcGAddr;
  21. FROM ShelMgr  IMPORT ShelFind,ShelRead;
  22. FROM VRaster  IMPORT MFDB,VRTrnFm;
  23. FROM ObjcTool IMPORT INCLObjectFlags,TreeWalk;
  24. FROM PORTAB   IMPORT NULL,ANYPOINTER,SIGNEDWORD,UNSIGNEDWORD;
  25. CAST_IMPORT
  26.  
  27. IMPORT RsrcMgr,GetObject,SetObject;
  28.  
  29. PROCEDURE FixMFDB(VAR FDB : MFDB;
  30.                       Addr: ANYPOINTER;
  31.                       WB  : UNSIGNEDWORD;
  32.                       H   : UNSIGNEDWORD);
  33.  
  34. CONST BitsPerByte = 8;
  35.  
  36. BEGIN
  37.   WITH FDB DO
  38.     FDAddr:= Addr;
  39.     FDW:= WB * BitsPerByte;
  40.     FDH:= H;
  41.     FDWdWidth:= WB DIV 2;
  42.     FDNPlanes:= 1;
  43.   END;
  44. END FixMFDB;
  45.  
  46. PROCEDURE Transform(Src  : ANYPOINTER;
  47.                     SrcWB: UNSIGNEDWORD;
  48.                     Dst  : ANYPOINTER;
  49.                     DstWB: UNSIGNEDWORD;
  50.                     H    : UNSIGNEDWORD);
  51.  
  52. VAR SrcFDB: MFDB;
  53.     DstFDB: MFDB;
  54.     D     : UNSIGNEDWORD;
  55.  
  56. BEGIN
  57.   FixMFDB(SrcFDB,Src,SrcWB,H);
  58.   SrcFDB.FDStand:= TRUE;
  59.   FixMFDB(DstFDB,Dst,DstWB,H);
  60.   DstFDB.FDStand:= FALSE;
  61.   VRTrnFm(GrafHandle(D,D,D,D),SrcFDB,DstFDB);
  62. END Transform;
  63.  
  64. PROCEDURE TransformBitBlock(Block: BitBlkPtr);
  65. BEGIN
  66.   WITH Block^ DO
  67.     IF BIPData # NULL THEN
  68.       Transform(BIPData,BIWB,BIPData,BIWB,BIHL);
  69.     END;
  70.   END;
  71. END TransformBitBlock;
  72.  
  73. PROCEDURE TransformObject(Tree: TreePtr; Index: ObjectIndex);
  74.  
  75. CONST BitsPerByte = 8;
  76.       Transformed = Flag15;
  77.  
  78. VAR ObSpec: ObjectSpec;
  79.     WB    : UNSIGNEDWORD;
  80.  
  81. BEGIN
  82.   ObSpec.Address:= GetObject.Spec(Tree,Index);
  83.   IF ObSpec.Address = NULL THEN
  84.     RETURN;
  85.   END;
  86.  
  87.   CASE GetObject.Type(Tree,Index) OF
  88.     GImage:
  89.       IF NOT(Transformed IN GetObject.Flags(Tree,Index)) THEN
  90.         TransformBitBlock(ObSpec.BitBlock);
  91.         INCLObjectFlags(Tree,Index,Transformed);
  92.       END;
  93.  
  94.       (* better do this than nothing *)
  95.  
  96.       SetObject.Height(Tree,Index,ObSpec.BitBlock^.BIHL);
  97.  
  98.   | GIcon:
  99.       IF NOT(Transformed IN GetObject.Flags(Tree,Index)) THEN
  100.         WITH ObSpec.IconBlock^ DO
  101.  
  102.           (* transform icon from standard to screen format *)
  103.  
  104.           WB:= (IBWIcon + 7) DIV BitsPerByte;
  105.           Transform(IBPData,WB,IBPData,WB,IBHIcon);
  106.           Transform(IBPMask,WB,IBPMask,WB,IBHIcon);
  107.  
  108.           (* correct height *)
  109.  
  110.           SetObject.Height(Tree,Index,IBHIcon + IBHText);
  111.  
  112.         END;
  113.         INCLObjectFlags(Tree,Index,Transformed);
  114.       END;
  115.   (*
  116.   | GCIcon:
  117.   *)
  118.   ELSE
  119.     RETURN;
  120.   END;
  121. END TransformObject;
  122.  
  123.   PROCEDURE transform(Tree: TreePtr; Index: ObjectIndex): BOOLEAN;
  124.   BEGIN
  125.     TransformObject(Tree,Index);
  126.     RETURN Index < (MaxObject - 1);
  127.   END transform;
  128.  
  129. PROCEDURE TransformTree(Tree: TreePtr);
  130. BEGIN
  131.   TreeWalk(Tree,Root,Nil,transform);
  132. END TransformTree;
  133.  
  134. PROCEDURE NumberOfTrees(): TreeIndex;
  135. BEGIN
  136. #if not UNIX
  137.   IF Global.ApPMem # NULL THEN
  138.     RETURN Global.ApPMem^.RsHNTree;
  139.   ELSE
  140.     RETURN 0;
  141.   END;
  142. #else
  143.  
  144. #endif
  145. END NumberOfTrees;
  146.  
  147. PROCEDURE TreeArray(T: TreeIndex): TreePtr;
  148. BEGIN
  149. #if not UNIX
  150.   IF Global.ApPTree # NULL THEN
  151.     RETURN Global.ApPTree^[T];
  152.   ELSE
  153.     RETURN NULL;
  154.   END;
  155. #else
  156.  
  157. #endif
  158. END TreeArray;
  159.  
  160. VAR ScanCodeTree: TreePtr;
  161.  
  162. PROCEDURE GetScanCodeTree(): TreePtr;
  163.  
  164. CONST MagicScan = 127;
  165.  
  166. VAR Tree: TreeIndex;
  167.  
  168. BEGIN
  169.   IF ScanCodeTree = NIL THEN (* is it the first call? *)
  170.     FOR Tree:= 0 TO (NumberOfTrees() - 1) DO
  171.       IF GetObject.Extnd(TreeArray(Tree),Root) = MagicScan THEN
  172.         ScanCodeTree:= TreeArray(Tree);
  173.         RETURN ScanCodeTree;
  174.       END;
  175.     END;
  176.   ELSE
  177.     RETURN ScanCodeTree;
  178.   END;
  179. END GetScanCodeTree;
  180.  
  181. PROCEDURE RsrcLoad(REF Name: ARRAY OF CHAR): BOOLEAN;
  182.  
  183. CONST MagicScan = 127;
  184.  
  185. VAR Tree: TreeIndex;
  186.  
  187. BEGIN
  188.   IF NOT rsrcload(Name) THEN
  189.     IF NOT ShelFind(Name) THEN
  190.       FormError(NoFile);
  191.     ELSE
  192.       FormError(NoMemory);
  193.     END;
  194.     RETURN FALSE;
  195.   ELSE
  196.     ScanCodeTree:= NIL;
  197.  
  198.     FOR Tree:= 0 TO (NumberOfTrees() - 1) DO
  199.       IF GetObject.Extnd(TreeArray(Tree),Root) = MagicScan THEN
  200.         ScanCodeTree:= TreeArray(Tree);
  201.         RETURN TRUE;
  202.       END;
  203.     END;
  204.     RETURN TRUE;
  205.   END;
  206. END RsrcLoad;
  207.  
  208. (*
  209. PROCEDURE LookupResource(): BOOLEAN;
  210.  
  211. TYPE Str128 = ARRAY[0..127] OF CHAR;
  212.  
  213. BEGIN
  214.  
  215.   ShelRead(Command,Tail);
  216.  
  217.   RETURN LoadResource("Command"+".RSC");
  218. END LookupResource;
  219. *)
  220.  
  221. PROCEDURE GetTreePtr(TreeNo: TreeIndex): TreePtr;
  222.  
  223. VAR Tree: TreePtr;
  224.  
  225. BEGIN
  226.   Tree:= NIL;
  227.   IF RsrcGAddr(RTree,TreeNo,Tree) THEN
  228.     TransformTree(Tree);
  229.   END;
  230.   RETURN Tree;
  231. END GetTreePtr;
  232.  
  233. PROCEDURE GetStringPtr(StringNo: StringIndex): StringPtr;
  234.  
  235. VAR String: StringPtr;
  236.  
  237. BEGIN
  238.   IF RsrcGAddr(RString,StringNo,String) THEN
  239.     RETURN String;
  240.   END;
  241.   RETURN NIL;
  242. END GetStringPtr;
  243.  
  244. PROCEDURE GetFreeStringPtr(FreeStringNo: FreeStringIndex): StringPtr;
  245.  
  246. VAR FreeString: FreeStringPtr;
  247.  
  248. BEGIN
  249.   IF RsrcGAddr(RFrStr,FreeStringNo,FreeString) THEN
  250.     RETURN FreeString^;
  251.   END;
  252.   RETURN NIL;
  253. END GetFreeStringPtr;
  254.  
  255. PROCEDURE GetFreeImagePtr(FreeImageNo: FreeImageIndex): BitBlkPtr;
  256.  
  257. VAR FreeImage: FreeImagePtr;
  258.  
  259. BEGIN
  260.   IF RsrcGAddr(RFrImg,FreeImageNo,FreeImage) THEN
  261.     TransformBitBlock(FreeImage^); (* important for PC-GEM *)
  262.     RETURN FreeImage^;
  263.   END;
  264.   RETURN NIL;
  265. END GetFreeImagePtr;
  266.  
  267. PROCEDURE SpecialChar(Code: Key): CHAR;
  268.  
  269. VAR ActString: ObjectIndex;
  270.     String   : StringPtr;
  271.  
  272.   PROCEDURE WordOfString(VAR Str: ARRAY OF CHAR): ScanWord;
  273.  
  274.   CONST HexChars = "0123456789ABCDEF";
  275.  
  276.   TYPE HexIndex = [0..16];
  277.  
  278.   VAR i        : HexIndex;
  279.       j        : [0..3];
  280.       Word     : ScanWord;
  281.       HexString: ARRAY HexIndex OF CHAR;
  282.  
  283.   BEGIN
  284.     HexString:= HexChars;
  285.     Word:= 0;
  286.  
  287.     FOR j:= 0 TO 3 DO
  288.       i:= 0;
  289.       WHILE Str[j] # HexString[i] DO
  290.         INC(i);
  291.       END;
  292.       Word:= VAL(ScanWord,i) + 16 * Word;
  293.     END;
  294.  
  295.     RETURN Word;
  296.   END WordOfString;
  297.  
  298. BEGIN
  299.   IF ScanCodeTree # NIL THEN
  300.     ActString:= Root; (* GBox *)
  301.  
  302.     REPEAT
  303.       INC(ActString);
  304.       String:= GetObject.StringPtr(ScanCodeTree,ActString);
  305. #if packing
  306.       IF Code.ScanCode = WordOfString(String^) THEN
  307. #else
  308.       IF Code = WordOfString(String^) THEN
  309. #endif
  310.         RETURN String^[5]; (* format: "0123◆X" *)
  311.       END;
  312.     UNTIL LastOb IN GetObject.Flags(ScanCodeTree,ActString);
  313.  
  314.   END;
  315.  
  316.   RETURN 0C; (* repeat loop without success or ScanCodeTree NOT found *)
  317. END SpecialChar;
  318.  
  319. BEGIN
  320.   RsrcMgr.RsrcLoad:= RsrcLoad;
  321. #if not proc_const
  322.   TransGImage:= TransformObject;
  323. #endif
  324. END RsrcTool.
  325.  
  326.